Op deze pagina vind je enkele demonstraties van hoe je R kan gebruiken om data te visualiseren.
Meer informatie over hoe je deze pagina kan gebruiken vind je in deze handleiding.
De analyse gebeurt met behulp van R en RStudio. Een inleiding tot deze software vind je hier.
Visualiseren helpt om inzicht te krijgen in data. Onderzoekers gebruiken visualisaties vaak in de verkennende fase van een studie, als manier om zich een eerste indruk te vormen van een dataset. Het kan eveneens nuttig - soms zelfs noodzakelijk - zijn wanneer je de resultaten van je studie wil communiceren naar je doelpubliek.
Op deze pagina focussen we op de praktische kant: hoe kan je data
visualiseren met R? Er zijn al heel wat mogelijkheden met de basisversie
van R (“base R”). Hieronder vind je voorbeelden van wat je daarmee kan
bereiken. Daarnaast bestaat er ook een package ggplot2
dat
speciaal ontworpen is met het oog op datavisualisatie. Dat biedt nog
meer mogelijkheden, maar is ook wat moeilijker om aan te leren.
ggplot2
wordt elders gedemonstreerd.
Hieronder vind je voorbeelden van verschillende types visualisaties
(histogram, boxplot, enz.). Er is geen ellenlange uitleg voorzien bij
elk type. Soms vind je in het lichtblauwe blok telkens wat commentaar
bij de code zelf (rechts van de #
).
De dataset enquete bevat gegevens van 14 variabelen geobserveerd bij 42 Amerikaanse studenten die een vak statistiek volgen. Deze dataset is gebaseerd op een dataset die hier wordt beschreven.
Deze dataset kan je inladen met de functie read.csv()
.
De data kan je best meteen in een object enquete
onderbrengen zodat je die later makkelijk opnieuw kan oproepen.
enquete <- read.csv("https://statlas.ugent.be/datasets/enquete_vis.csv")
Je kan het dataframe enquete
beginnen verkennen met
bijvoorbeeld de functie str()
.
str(enquete)
'data.frame': 42 obs. of 14 variables:
$ Index : int 1 2 3 4 5 6 7 8 9 10 ...
$ Sectie : int 1 1 1 1 1 1 1 1 1 1 ...
$ Jaar : chr "Vierde jaar" "Eerste jaar" "Eerste jaar" "Eerste jaar" ...
$ Geslacht : chr "Vrouw" "Vrouw" "Vrouw" "Man" ...
$ Afstand : num 644 724 4828 161 3219 ...
$ Lengte : num 157 155 155 183 175 ...
$ Dominante.hand: chr "Rechts" "Links" "Rechts" "Rechts" ...
$ Munten : num 1.12 29 1.5 0.07 0.12 8 0.77 0 0 0 ...
$ Wit.koord : num 106.7 114.3 55.9 101.6 121.9 ...
$ Zwart.koord : num 15.2 12.7 10.2 10.2 17.8 ...
$ Lezen : num 80 100 100 50 200 100 200 100 100 100 ...
$ Tv : num 3 10 4 25 5 0 2 2 20 20 ...
$ Hartslag : int 71 78 80 63 63 56 72 66 54 48 ...
$ Berichten : int 3 100 2 200 100 1 50 30 40 25 ...
In de output zie je dat er verschillende types variabelen te vinden
zijn in enquete
. De types int
en
num
staan beide voor metrische variabelen. chr
slaat op tekstuele informatie. Dat zie je ook aan de aanhalingstekens
rondom de waarden voor deze variabelen.
Eigenlijk is het gebruik van chr
niet ideaal. Dit
datatype is meer geschikt voor eigennamen, zoals voor- en familienamen
van individuen. Wanneer een vector waarden van een categorische
variabele bevat kan je beter opteren voor het datatype
factor
.
Een vector omzetten van type chr
naar type
factor
is eenvoudig. Hieronder doen we dat voor alle
chr
variabelen in de dataset.
enquete$Jaar <- factor(enquete$Jaar)
enquete$Geslacht <- factor(enquete$Geslacht)
enquete$Dominante.hand <- factor(enquete$Dominante.hand)
Een histogram laat je toe om de verdeling van een continue variabele weer te geven. Hieronder gaat het om de afstand die studenten moeten afleggen om op hun campus te raken.
hist(enquete$Afstand)
De waarden van de continue variabele worden in klassen ingedeeld. Het aantal klassen en/of de grenswaarden tussen de klassen kan je zelf controleren.
hist(enquete$Afstand, breaks = 4) # kies het aantal klassen
hist(enquete$Afstand, breaks = c(0, 20000, 40000, 60000)) # bepaal de klassengrenzen
hist(enquete$Afstand, breaks = seq(from=0, to=60000, by=1000)) # bepaal de klassengrenzen
Staafdiagrammen tonen de frequentie van de waarden van een
categorische variabele, in dit geval de dominante hand. De functie
daarvoor heet barplot()
. Aan deze functie kan je niet
gewoon de categorische variabele zelf geven. Dat leidt tot een
foutmelding.
barplot(enquete$Dominante.hand)
Error in barplot.default(enquete$Dominante.hand): 'height' must be a vector or a matrix
In plaats daarvan gebruik je eerst de functie table()
om
de frequenties te bekomen.
barplot(table(enquete$Dominante.hand))
De functie boxplot()
levert niet zo verrassend een
boxplot op. Hieronder gaat het om het aantal berichten dat een student
de voorbije 24 uur heeft gestuurd.
boxplot(enquete$Berichten)
De plot hierboven heeft een nadeel. De centrale “box” van de boxplot is
wat samengepropt onderaan de figuur. Dat komt door enkele observaties
met extreem hoge waarden (uitschieters). Het is mogelijk om meer te
focussen op de regio waar het overgrote deel van de gevallen zich
bevinden, namelijk tussen waarden 0 en 100. Daartoe passen we gewoon de
grenzen van de verticale as aan met het argument ylim
.
boxplot(enquete$Berichten, ylim=c(0,100))
Merk op dat de uitschieters nu buiten de plot vallen maar wel nog in de dataset zitten. De boxplot zelf is dus op geen enkele manier veranderd!
Het kan ook interessant zijn om de verdeling van een variabele in
verschillende groepen met elkaar te vergelijken. Daartoe kan je meerdere
boxplots naast elkaar plaatsen in dezelfde grafiek. Bijvoorbeeld, om de
verdeling van het aantal gestuurde berichten (Berichten
) te
vergelijken tussen mannen en vrouwen (Geslacht
) kan je
onderstaande code gebruiken. De tilde ~
in het commando kan
je lezen als “opgesplitst volgens …”.
boxplot(enquete$Berichten ~ enquete$Geslacht)
Opnieuw zijn de boxplots wat samengepropt. Dat kan je -indien
gewenst- verhelpen met het argument ylim
(zie ook
hierboven)
Om gegevens van twee continue variabelen weer te geven kan je een scatterplot gebruiken. Om te zien hoeveel uur per week de studenten spenderen aan kijken naar tv en hoeveel uur aan lezen kan je onderstaande code gebruiken.
plot(enquete$Tv, enquete$Lezen)
Het is mogelijk dat twee of meer studenten precies dezelfde waarde
hebben voor zowel Tv
als Lezen
. In dat geval
zullen ze in de scatterplot op dezelfde plaats terechtkomen. Het is
bijgevolg niet duidelijk of een punt in de puntenwolk 1 observatie
vertegenwoordigt, of 2 observaties of nog meer. Om dit probleem op te
lossen kan je gebruik maken van de functie jitter()
. Die
voegt een zekere hoeveelheid willekeurige “ruis” toe aan de waarden. De
hoeveelheid “ruis” controleer je met het argument
amount
.
plot(x=jitter(enquete$Tv, amount=0.4), y=jitter(enquete$Lezen, amount=1.5))
Je ziet onder andere in de rood gekleurde regio inderdaad dat er enkele punten “achter elkaar” verscholen zaten.
Zoals je het argument ylim
eventueel kan gebruiken om te
bepalen welk deel van de verticale as wordt getoond, zo kan je
xlim
gebruiken voor de horizontale as.
plot(enquete$Tv, enquete$Lezen, xlim=c(0,15), ylim=c(0,300))
De functies hierboven bevatten vaak heel wat argumenten waarmee je de grafiek kan afwerken. Hieronder vind je code om een titel en astitels toe te voegen of aan te passen bij een scatterplot. (De argumenten staan onder elkaar voor de leesbaarheid.)
Bij de astitels kan je best ook de meeteenheid meegeven (indien van toepassing).
plot(x=enquete$Tv,
y=enquete$Lezen,
main='Mijn titel', # hoofdtitel
xlab='Tv kijken (uren per week)', # titel voor horizontale as
ylab='Lezen (pagina\'s per week)' # titel voor verticale as
)
Daarnaast heb je heel wat keuzes voor de presentatie van de informatie zelf. Deze grafische parameters kan je natuurlijk combineren met een titel en astitels.
plot(enquete$Tv,
enquete$Lezen,
pch=19, # kies het soort punt
col='turquoise3', # kies de kleur
cex=0.7 # kies de grootte van het punt (waarden groter dan 1 vergroten het punt)
)
R heeft heel wat ingebouwde kleuren. De volledige lijst kan je
opvragen door het commando colors()
uit te voeren. Een
overzicht waar je de kleuren erbij kan zien vind je
hier.
Een grafiek kan informatie bevatten over meer dan twee variabelen. Bijvoorbeeld door gebruik te maken van kleur kan je een derde variabele afbeelden. Hieronder vind je code voor een scatterplot, waarbij de observaties worden opgedeeld volgens de waarden van een derde variabele. Die laatste is degene die wordt weergegeven aan de hand van kleuren.
plot(x=enquete$Tv,
y=enquete$Lezen,
col=enquete$Jaar # deze variabele moet van type factor zijn
)
Deze grafiek heeft nog wat verduidelijking nodig. De kleur van de verschillende punten is niet altijd even duidelijk omdat het ‘punt’ eigenlijk een holle cirkel is. Daarom veranderen we het type punt. Bovendien is het moeilijk te achterhalen wat elke kleur precies betekent. Daarom voegen we een legende toe.
plot(x=enquete$Tv,
y=enquete$Lezen,
col=enquete$Jaar,
pch=19
)
legend('topright', # positie van de legende vastleggen. Kan ook met coördinaten x en y
legend=unique(enquete$Jaar),
fill=unique(enquete$Jaar)) # argument col kan ook, maar leidt soms tot problemen met de weergave
Hieronder vind je terug hoe je zelf kan bepalen welke kleuren worden gebruikt.
mijn.kleuren <- c('tomato', 'turquoise4', 'skyblue2', 'magenta3') # specifieer evenveel kleuren als er niveaus zijn in de categorische variabele
plot(x=enquete$Tv,
y=enquete$Lezen,
pch=19,
col=mijn.kleuren[enquete$Jaar])
legend('topright',
legend=unique(enquete$Jaar),
fill=mijn.kleuren[unique(enquete$Jaar)]
)
Wanneer je een grafiek hebt gemaakt zal je die misschien willen opslaan om later op te nemen in bijvoorbeeld een Worddocument of Powerpointpresentatie.
Je plot opslaan kan door die te creëren tussen twee commando’s:
png('titel.png')
dev.off()
Bijvoorbeeld,
png('mijngrafiek.png')
plot(x=enquete$Tv, y=enquete$Lezen, col=enquete$Jaar)
dev.off()
Het resultaat zal zijn dat in je working directory een bestand verschijnt met de naam “mijngrafiek.png”. Uiteraard kan je kiezen voor een andere naam dan “mijngrafiek”. De extensie “.png” is iets technisch dat verwijst naar het type afbeelding. Je kan dit eventueel ook veranderen, maar doorgaans is dat niet nodig of nuttig.
In de beknopte demonstraties hierboven hebben we telkens maar een klein tipje van de sluier gelicht. Er zijn veel meer mogelijkheden. Sommige ervan vind je in deze “cheat sheet”. Ook Google of AI-chatbots kunnen je natuurlijk verderhelpen.